/* 
 * File:   main.cpp
 * Author: JM, Michał Kołodziejski
 *
 * Created on 11 maj 2010, 19:57
 */

#include <stdlib.h>
#include <log4cxx/logger.h>
#include <log4cxx/basicconfigurator.h>
#include <log4cxx/propertyconfigurator.h>
#include <log4cxx/helpers/exception.h>
#include <iostream>
#include "Linda.h"

using namespace log4cxx;
using namespace log4cxx::helpers;
using namespace std;

LoggerPtr logger(Logger::getLogger("Linda"));

void startInterpreter();

/*
 * 
 */
int main(int argc, char** argv) {

    PropertyConfigurator::configure("log4cxx.config");

    LOG4CXX_INFO(logger, "Entering application.");

    startInterpreter();

    LOG4CXX_INFO(logger, "Exiting application.");
    return (EXIT_SUCCESS);
}


void startInterpreter(){
    int queueId;
    cout << "Identyfikator kolejki komunikatow: ";
    cin >> queueId;

    Linda linda(queueId);
    string command;
    string result;
    while(command.substr(0,4) != "quit" && command.substr(0,4) != "exit"){
        cout << "Operacja (output | input | read | exit): ";
        cin >> command;
        if(command.substr(0, 6) == "output"){
            // output
            cout << "Krotka: ";
            cin >> command;
            try {
                linda.output(command);
            } catch (LindaSendingException &e){
                cout << "Wystąpił wyjątek podczas wysyłania komunikatu do serwera!!!" << endl;
            }

        } else if(command.substr(0, 5) == "input"){
            // input
            cout << "Wzorzec krotki: ";
            cin >> command;
            int timeout;
            cout << "Timeout (-1 gdy brak): ";
            cin >> timeout;
            try {
                result = linda.input(command, timeout);
                cout << "Wynik: " << result << endl;
            } catch (LindaSendingException &e){
                cout << "Wystąpił wyjątek podczas wysyłania komunikatu do serwera!!!" << endl;
            } catch (LindaReceivingException &e){
                cout << "Wystąpił wyjątek podczas odbierania komunikatu od serwera!!!" << endl;
            } catch (LindaMalformedMessageException &e){
                cout << "Wystąpił wyjątek: zły format wzorca krotki!!!" << endl;
            } catch (LindaTimeoutException &e){
                cout << "Wystąpił wyjątek przekroczenia czasu żądania!!!" << endl;
            } catch (LindaServerErrorException &e){
                cout << "Wystąpił wyjątek serwera!!!" << endl;
            }

        } else if (command.substr(0, 4) == "read"){
            // read
            cout << "Wzorzec krotki: ";
            cin >> command;
            int timeout;
            cout << "Timeout (-1 gdy brak): ";
            cin >> timeout;
            try {
                result = linda.read(command, timeout);
                cout << "Wynik: " << result << endl;
            } catch (LindaSendingException &e){
                cout << "Wystąpił wyjątek podczas wysyłania komunikatu do serwera!!!" << endl;
            } catch (LindaReceivingException &e){
                cout << "Wystąpił wyjątek podczas odbierania komunikatu od serwera!!!" << endl;
            } catch (LindaMalformedMessageException &e){
                cout << "Wystąpił wyjątek: zły format wzorca krotki!!!" << endl;
            } catch (LindaTimeoutException &e){
                cout << "Wystąpił wyjątek przekroczenia czasu żądania!!!" << endl;
            } catch (LindaServerErrorException &e){
                cout << "Wystąpił wyjątek serwera!!!" << endl;
            }
        }
        cout << endl;
    }
}
